package com.bi.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bi.entity.ComponentLibrary;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 组件库Mapper接口
 * 
 * @author BI Platform Team
 * @since 1.0.0
 */
@Mapper
public interface ComponentLibraryMapper extends BaseMapper<ComponentLibrary> {

    /**
     * 分页查询组件库
     * 
     * @param page 分页参数
     * @param params 查询参数
     * @return 分页结果
     */
    IPage<ComponentLibrary> selectComponentLibraryPage(Page<ComponentLibrary> page, @Param("params") Map<String, Object> params);

    /**
     * 根据分类查询组件
     * 
     * @param categoryId 分类ID
     * @return 组件列表
     */
    List<ComponentLibrary> selectByCategoryId(@Param("categoryId") Long categoryId);

    /**
     * 根据组件类型查询组件
     * 
     * @param componentType 组件类型
     * @return 组件列表
     */
    List<ComponentLibrary> selectByComponentType(@Param("componentType") String componentType);

    /**
     * 根据标签查询组件
     * 
     * @param tags 标签列表
     * @return 组件列表
     */
    List<ComponentLibrary> selectByTags(@Param("tags") List<String> tags);

    /**
     * 查询推荐组件
     * 
     * @param limit 限制数量
     * @return 推荐组件列表
     */
    List<ComponentLibrary> selectRecommendedComponents(@Param("limit") Integer limit);

    /**
     * 查询热门组件（按使用次数）
     * 
     * @param limit 限制数量
     * @return 热门组件列表
     */
    List<ComponentLibrary> selectPopularComponents(@Param("limit") Integer limit);

    /**
     * 查询组件库统计信息
     * 
     * @return 统计信息
     */
    Map<String, Object> selectLibraryStatistics();

    /**
     * 更新组件使用次数
     * 
     * @param componentId 组件ID
     * @return 更新结果
     */
    int incrementUsageCount(@Param("componentId") Long componentId);

    /**
     * 更新组件评分
     * 
     * @param componentId 组件ID
     * @param rating 评分
     * @return 更新结果
     */
    int updateRating(@Param("componentId") Long componentId, @Param("rating") Double rating);

    /**
     * 搜索组件
     * 
     * @param keyword 关键词
     * @param componentType 组件类型
     * @param categoryId 分类ID
     * @return 搜索结果
     */
    List<ComponentLibrary> searchComponents(@Param("keyword") String keyword, 
                                          @Param("componentType") String componentType,
                                          @Param("categoryId") Long categoryId);
}